package com.system.connect.springboot_flowers.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.system.connect.springboot_flowers.entity.Usercoupons;
import com.system.connect.springboot_flowers.service.IUsercouponsService;
import com.system.connect.springboot_flowers.utils.R;
import com.system.connect.springboot_flowers.utils.TokenUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * 用户优惠券控制器
 */
@Slf4j
@RestController
@RequestMapping("/api/usercoupons")
public class UsercouponsController {

    @Autowired
    private IUsercouponsService usercouponsService;

    /**
     * 获取用户所有优惠券
     */
    @GetMapping("/list")
    public R<List<Usercoupons>> getCouponList() {
        Integer userId = Integer.valueOf(TokenUtils.getUser());
        QueryWrapper<Usercoupons> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id", userId)
                   .orderByDesc("get_time");
        return R.success(usercouponsService.list(queryWrapper));
    }

    /**
     * 获取未使用优惠券
     */
    @GetMapping("/unused")
    public R<List<Usercoupons>> getUnusedCoupons() {
        try {
            // 1. 获取用户ID并验证
            String userStr = TokenUtils.getUser();
            log.info("Token中的用户信息: {}", userStr);
            
            if (userStr == null || userStr.isEmpty()) {
                return R.error("用户未登录");
            }
            
            Integer userId = Integer.valueOf(userStr);
            log.info("当前用户ID: {}", userId);
            
            // 2. 构建查询条件
            QueryWrapper<Usercoupons> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("user_id", userId)
                       .eq("status", 0)  // 使用数字0表示未使用状态
                       .orderByDesc("get_time");
            
            // 3. 打印SQL语句
            log.info("SQL查询条件: {}", queryWrapper.getSqlSegment());
            
            // 4. 执行查询
            List<Usercoupons> coupons = usercouponsService.list(queryWrapper);
            log.info("查询到的优惠券数量: {}", coupons.size());
            
            // 5. 返回结果
            return R.success(coupons);
            
        } catch (NumberFormatException e) {
            log.error("用户ID格式错误", e);
            return R.error("用户ID格式错误");
        } catch (Exception e) {
            log.error("获取未使用优惠券失败", e);
            return R.error("获取优惠券失败，请重试");
        }
    }

    /**
     * 获取已使用优惠券
     */
    @GetMapping("/used")
    public R<List<Usercoupons>> getUsedCoupons() {
        try {
            Integer userId = Integer.valueOf(TokenUtils.getUser());
            QueryWrapper<Usercoupons> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("user_id", userId)
                       .eq("status", 1)  // 使用数字1表示已使用状态
                       .orderByDesc("used_at");
            return R.success(usercouponsService.list(queryWrapper));
        } catch (Exception e) {
            log.error("获取已使用优惠券失败", e);
            return R.error("获取优惠券失败，请重试");
        }
    }

    /**
     * 获取已过期优惠券
     */
    @GetMapping("/expired")
    public R<List<Usercoupons>> getExpiredCoupons() {
        try {
            Integer userId = Integer.valueOf(TokenUtils.getUser());
            QueryWrapper<Usercoupons> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("user_id", userId)
                       .eq("status", 2)  // 使用数字2表示已过期状态
                       .orderByDesc("expire_time");
            return R.success(usercouponsService.list(queryWrapper));
        } catch (Exception e) {
            log.error("获取已过期优惠券失败", e);
            return R.error("获取优惠券失败，请重试");
        }
    }

    /**
     * 领取优惠券
     */
    @PostMapping("/receive/{couponId}")
    public R receiveCoupon(@PathVariable Integer couponId) {
        // 1. 获取当前登录用户ID
        Integer userId = Integer.valueOf(TokenUtils.getUser());
        if (userId == null) {
            return R.error("请先登录");
        }
        
        // 2. 检查是否已经领取过该优惠券
        QueryWrapper<Usercoupons> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id", userId)
                   .eq("coupon_id", couponId);
        if (usercouponsService.count(queryWrapper) > 0) {
            return R.error("您已领取过该优惠券");
        }
        
        // 3. 创建用户优惠券记录
        Usercoupons usercoupon = new Usercoupons();
        usercoupon.setUserId(userId);
        usercoupon.setCouponId(couponId);
        usercoupon.setStatus(0);
        usercoupon.setGetTime(new Date());
        
        // 4. 保存记录
        try {
            usercouponsService.save(usercoupon);
            return R.success("领取成功");
        } catch (Exception e) {
            return R.error("领取失败，请重试");
        }
    }
}